package org.csy.generic.test06;

import java.util.ArrayList;
import java.util.List;

/**
 * 型变
 *  1）不变：赋值运行符左右两边的泛型必须一致
 *
 *  2）协变：子类型的泛型可以赋值给父类型的泛型 - 通配符
 *   类<? extends 父类> 对象 = new 类<子类>()
 *   ArrayList<? extends Animal> list = new ArrayList<Cat>();
 *
 *  3）逆变
 *
 * @author CSY
 * @date 2025 - 03 - 27
 */
public class MainTest03 {
    public static void main(String[] args) {
        List<Dog> doglist =new ArrayList<>();
        doglist.add(new Dog());
        doglist.add(new Dog());
        doglist.add(new Dog());
        //泛型的协变性 - 泛型父类可以接收泛型子类
        //?表示未知类型 但可以确定要么是Animal类型要么是Animal类型的子类
        List<? extends Animal> list = doglist;

        System.out.println(list.size());

        //错误 - add是一个含有泛型参数的方法，为了确保类型安全，不允许含有泛型参数的方法操作
//        list.add(new Dog());

    }
}
